package server.control;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import server.domain.ShopVerwaltung;
import shop.exceptions.ArtikelExistiertNichtException;
import shop.exceptions.BestandZuGeringException;
import shop.exceptions.KeinVielfachesVonException;
import shop.exceptions.WarenkorbIstLeerException;
import shop.local.valueobjects.ArtikelListe;
import shop.local.valueobjects.Ereignisliste;
import shop.local.valueobjects.Kunde;
import shop.local.valueobjects.KundenListe;
import shop.local.valueobjects.MitarbeiterListe;
import shop.local.valueobjects.Warenkorb;


public class RequestProcessor implements Runnable {
	private int nummer;
	private Socket clientSocket;
	private ObjectOutputStream out;
	private ObjectInputStream in;
	private String input;
	private ShopVerwaltung shop;
	
	public RequestProcessor(Socket socket, ShopVerwaltung shop, int nr) {
		this.nummer = nr;
		clientSocket = socket;
		this.shop = shop;
		try {
			out = new ObjectOutputStream(clientSocket.getOutputStream());
			out.flush();
			in = new ObjectInputStream(clientSocket.getInputStream());
		} catch (IOException e) {
			try {
				e.printStackTrace();
				clientSocket.close();
			} catch (IOException e2) {
			}
			System.err.println("Fehler beim oeffnen des Streams: " + e);
			e.printStackTrace();
		}
	}	
		
	
	public void run() {	
		sendMessage("Verbindung?");
		do {
			try {
				input = (String) in.readObject();
			} catch (Exception e) {
				if (e.getMessage().equals("Connection reset")) {
					System.out.println("Verbindung vom Client wurde zurueckgesetzt.");
					break;
				}
				else {
					System.out.println("--->Fehler beim Lesen vom Client (Aktion): ");
					System.out.println(e.getMessage());
					continue;
				}
				
			}
						
			// Inputs
			System.out.println("Client " + nummer + "> " + input);
			if (input.equals("bye")) {
				sendMessage("bye");
			}
			else if (input.equals("gibAlleArtikel")) {
                	gibAlleArtikel();
            }
            else if (input.equals("sucheNachTitel")) {
                    sucheNachTitel();
            }
            else if (input.equals("sucheNachNummer")) {
                    sucheNachNummer();
            }
            else if (input.equals("sucheNachMitarbeiterNummer")) {
                    sucheNachMitarbeiterNummer();
            }
            else if (input.equals("sucheNachKundenNummer")) {
                    sucheNachKundenNummer();
            }
            else if (input.equals("legeArtikelAn")) {
                    legeArtikelAn();
            }
            else if (input.equals("legeMassengutAn")) {
                    legeMassengutAn();
            }
            else if (input.equals("legeMitarbeiterAn")) {
                    legeMitarbeiterAn();
            }
            else if (input.equals("legeKundenAn")) {
                    legeKundenAn();
            }
            else if (input.equals("mitarbeiterLogin")) {
                    mitarbeiterLogin();
            }
            else if (input.equals("kundenLogin")) {
                    kundenLogin();
            }
            else if (input.equals("gibAlleEreignisse")) {
                    gibAlleEreignisse();
            }
            else if (input.equals("gibAlleKunden")) {
                    gibAlleKunden();
            }
            else if (input.equals("gibAlleMitarbeiter")) {
                    gibAlleMitarbeiter();
            }
            else if (input.equals("gibWarenkorb")) {
                    gibWarenkorb();
            }
            else if (input.equals("setzeListe")) {
                	setzeListe();
            }
            else if (input.equals("setzeKundenListe")) {
	            	setzeKundenListe();
	        }
            else if (input.equals("setzeMitarbeiterListe")) {
            		setzeMitarbeiterListe();
            }
            else if (input.equals("einenKundenSichern")) {
        			einenKundenSichern();
            }	
            else if (input.equals("schreibeArtikel")) {
                    schreibeArtikel();
            }
            else if (input.equals("schreibeKunden")) {
                    schreibeKunden();
            }
            else if (input.equals("schreibeMitarbeiter")) {
                    schreibeMitarbeiter();
            }
            else if (input.equals("schreibeEreignis")) {
                    schreibeEreignis();
            }
            else if (input.equals("inWarenkorbLegen")) {
                    inWarenkorbLegen();
            }
            else if (input.equals("warenkorbLoeschen")) {
                    warenkorbLoeschen();
            }
            else if (input.equals("rechnungDrucken")) {
                    rechnungDrucken();
            }
            else if (input.equals("artikelKaufen")) {
                    artikelKaufen();
            }
            else if (input.equals("gibHistorie")) {
                    gibHistorie();
            }
            else if (input.equals("artikelLoeschen")) {
                    artikelLoeschen();
            }
	        else if (input.equals("mitarbeiterLoeschen")) {
	                mitarbeiterLoeschen();
	        }
            else if (input.equals("inWarenkorbLegen")) {
                    inWarenkorbLegen();
            }
		} while(!input.equals("bye"));
		
		try {
			clientSocket.close();
		} 
		catch (IOException e2) {}
	}
	
	void sendMessage(String msg)
	{
		try{
			out.writeObject(msg);
			out.flush();
			System.out.println("Server> " + msg);
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
	}
	
    public void gibAlleArtikel() {
        try {
                out.writeObject(shop.gibAlleArtikel());
        } 
        catch (IOException e) {
                e.printStackTrace();
        }
	}
	
	public void sucheNachTitel() {
	        try {
	                String titel = (String) in.readObject();
	                out.writeObject(shop.sucheNachTitel(titel));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void sucheNachNummer() {         
	        try {
	                int artNr = (Integer) in.readObject();
	                out.writeObject(shop.sucheNachNummer(artNr));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void sucheNachMitarbeiterNummer() {
	        try {
	                int mNr = (Integer) in.readObject();
	                out.writeObject(shop.sucheNachMitarbeiterNummer(mNr));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void sucheNachKundenNummer() {
	        try {
	                int kNr = (Integer) in.readObject();
	                out.writeObject(shop.sucheNachKundenNummer(kNr));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void legeArtikelAn() {
	        try {
	                String titel = (String) in.readObject();
	                String beschreibung = (String) in.readObject();
	                int nummer = (Integer) in.readObject();
	                int bestand = (Integer) in.readObject();
	                float preis = (Float) in.readObject();
	                out.writeObject(shop.legeArtikelAn(titel, beschreibung, nummer, bestand, preis));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }       
	}
	
	public void legeMassengutAn() {
	        try {
	                String titel = (String) in.readObject();
	                String beschreibung = (String) in.readObject();
	                int nummer = (Integer) in.readObject();
	                int bestand = (Integer) in.readObject();
	                float preis = (Float) in.readObject();
	                int ve = (Integer) in.readObject();
	                out.writeObject(shop.legeArtikelAn(titel, beschreibung, nummer, bestand, preis, ve));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void legeMitarbeiterAn() {
	        try {
	                String mName = (String) in.readObject();
	                String mPasswort = (String) in.readObject();
	                out.writeObject(shop.legeMitarbeiterAn(mName, mPasswort));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void legeKundenAn() {
	        try {
	                String kName = (String) in.readObject();
	                String kVorname = (String) in.readObject();
	                String kPasswort = (String) in.readObject();
	                String kStrasse = (String) in.readObject();
	                String kHausnummer = (String) in.readObject();
	                int kPlz = (Integer) in.readObject();
	                String kWohnort = (String) in.readObject();
	                out.writeObject(shop.legeKundenAn(kName, kVorname, kPasswort, kStrasse, kHausnummer, kPlz, kWohnort));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void mitarbeiterLogin() {                                        
	        try {
	                String mName = (String) in.readObject();
	                String mPasswort = (String) in.readObject();
	                out.writeObject(shop.mitarbeiterLogin(mName, mPasswort));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void kundenLogin() {                                     
	        try {
	                String kName = (String) in.readObject();
	                String kPasswort = (String) in.readObject();
	                out.writeObject(shop.kundenLogin(kName, kPasswort));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void gibAlleEreignisse() {
	        try {
	                out.writeObject(shop.gibAlleEreignisse());
	        } 
	        catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void gibAlleKunden() {
	        try {
	                out.writeObject(shop.gibAlleKunden());
	                out.flush();
	        } 
	        catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void gibAlleMitarbeiter() {
	        try {
	                out.writeObject(shop.gibAlleMitarbeiter());
	        } 
	        catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void gibWarenkorb() {
	        try {
	                int kNr = (Integer) in.readObject();
	                out.writeObject(shop.gibWarenkorb(kNr));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void einenKundenSichern() {
		try {
			KundenListe liste = (KundenListe) in.readObject();
			Kunde k = liste.get(1);
			shop.setzeKunden(k);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public void setzeListe() {
		try {
			ArtikelListe liste = (ArtikelListe) in.readObject();
			shop.setzeListe(liste);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    	
	}
	
	public void setzeKundenListe() {
		try {
			KundenListe liste = (KundenListe) in.readObject();
			shop.setzeKundenListe(liste);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    	
	}
	
	public void setzeMitarbeiterListe() {
		try {
			MitarbeiterListe liste = (MitarbeiterListe) in.readObject();
			shop.setzeMitarbeiterListe(liste);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    	
	}
	
	public void schreibeArtikel(){
	        try {
	            shop.schreibeArtikel();
	        } catch (IOException e) {
	                e.printStackTrace();
	        } 
	}
	
	public void schreibeKunden(){
	        try {
	                shop.schreibeKunden();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void schreibeMitarbeiter(){
	        try {
	                shop.schreibeMitarbeiter();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void schreibeEreignis() {
	        try {
	                shop.schreibeEreignis();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void inWarenkorbLegen() {
	        try {
	        		int kNr = (Integer) in.readObject();
	                Warenkorb korb = (Warenkorb) in.readObject();
	                ArtikelListe liste = (ArtikelListe) in.readObject();
	                shop.setzeListe(liste);
	                shop.inWarenkorbLegen(kNr, korb);
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        } catch (ArtikelExistiertNichtException e) { //Nochmal druebergehen...
	                // TODO Auto-generated catch block
	                e.printStackTrace();
	        } catch (BestandZuGeringException e) {
	                // TODO Auto-generated catch block
	                e.printStackTrace();
	        } catch (KeinVielfachesVonException e) {
	                // TODO Auto-generated catch block
	                e.printStackTrace();
	        }
	}       
	
	public void warenkorbLoeschen() {
	        try {
	                int kNr = (Integer) in.readObject();
	                shop.warenkorbLoeschen(kNr);
	        } catch (IOException e) {
	                e.printStackTrace();
	        } catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        }
	}
	        
	public void rechnungDrucken(){
	        try {
	                int kNr = (Integer) in.readObject();
	                out.writeObject(shop.rechnungDrucken(kNr));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	        
	public void artikelKaufen() {
	        try {
	                int kNr = (Integer) in.readObject();
	                Warenkorb liste = (Warenkorb) in.readObject();
	                shop.artikelKaufen(liste, kNr);
	                
	        } catch (IOException e) {
	                e.printStackTrace();
	        } catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        }
	}
	
	public void gibHistorie() {
	        try {
	                int artNr = (Integer) in.readObject();
	                int anzahlTage = (Integer) in.readObject();
	                out.writeObject(shop.gibHistorie(artNr, anzahlTage));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void artikelLoeschen() {
	        try {
	                int artNr = (Integer) in.readObject();
	                out.writeObject(shop.artikelLoeschen(artNr));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}
	
	public void mitarbeiterLoeschen() {
        try {
                int mNr = (Integer) in.readObject();
                out.writeObject(shop.mitarbeiterLoeschen(mNr));
        } 
        catch (ClassNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace();
        }
	}
	
	public void artikelBestand() {
	        try {
	                int artNr = (Integer) in.readObject();
	                int bestand = (Integer) in.readObject();
	                out.writeObject(shop.artikelBestand(artNr, bestand));
	        } 
	        catch (ClassNotFoundException e) {
	                e.printStackTrace();
	        } catch (IOException e) {
	                e.printStackTrace();
	        }
	}

}
